其他
学下图层,收下这颗小星星
前言
最近国外的疫情有点生猛,大家做好防护保重啊。周末了也不敢多走动,还是继续宅家学点东西写点笔记。
我是因为要用ggplot2
画图所以才学R
的。我相信做数据分析的人多多少少听过ggplot2
。它是一个非常流行的做数据可视化的R
包。熟悉它的绘图语法后,平时的数据可视化会变得很简单,而且也会反过来让你去思考数据的准备与清洗等等。在我还是小菜鸟的时候,当然现在了解越多越知道自己不知道的还有很多,所以现在仍然是一枚小菜鸟。
我就在想为什么ggplot2
中的star
不是⭐️,如果我想用自己定义的形状来画点可以不?在我老板Y叔
的指点下,抽空尝试自己先写了个简单的图层。就是画小星星的图层。
安装
我已经打包放在github
上了,感兴趣的自取。顺便说下,如果这篇分享的阅读量超200
。那我就再分享下关于R
包开发打包的微文。
if (!requireNamespace("remotes", quietly=TRUE))
install.packages("remotes")
remotes::install_github("xiangpin/ggstar")
使用
国旗
先画一面国旗,df
是⭐️的坐标位置,以及大小的标签。geom_star
就是实现的简单图层。
library(ggplot2)
library(ggstar)
df <- data.frame(x=c(0.13, 0.2, 0.25, 0.25, 0.2),
y=c(0.89, 0.96, 0.915, 0.855, 0.80),
size=c("B",rep("S",4)))
p <- ggplot(data=df, mapping=aes(x=x, y=y, size=size)) +
geom_star(fill="yellow",
angle=c(180, 30, 20, 180, 330),
show.legend=FALSE) +
scale_size_manual(values=c(10, 3)) +
theme_bw() +
theme(axis.text=element_blank(),
axis.ticks=element_blank(),
axis.title=element_blank(),
panel.grid=element_blank(),
panel.border=element_blank(),
panel.background=element_rect(fill="red"))
代替点图
library(ggplot2)
library(ggstar)
p2 <- ggplot(data=iris, aes(x=Sepal.Length, y=Sepal.Width, fill=Species)) +
geom_star(size=3.5) +
scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9")) +
theme_bw() +
theme(panel.grid=element_blank())
p2
set.seed(1024)
year <- rep(c(2017:2020), each=3)
para <- rep(c("length", "weight", "condition"), 4)
z_score <- runif(12, min = -5, max = 5)
daf <- data.frame(year=year, parameters=para, z_score=z_score)
daf
## year parameters z_score
## 1 2017 length -2.8191084
## 2 2017 weight 4.8763424
## 3 2017 condition -1.5153811
## 4 2018 length -1.1895301
## 5 2018 weight -4.7901404
## 6 2018 condition 2.4972687
## 7 2019 length -3.3704196
## 8 2019 weight -1.8095871
## 9 2019 condition 0.9789026
## 10 2020 length 0.8799732
## 11 2020 weight -4.8230487
## 12 2020 condition 4.5879460
legend_size <- c(10,8,5,1,5,8,10)
p3 <- ggplot(data=daf, aes(year, parameters)) +
geom_star(aes(fill = z_score, size = z_score)) +
scale_fill_continuous(type = "viridis", breaks = c(-3:3)) +
scale_size(breaks = c(-3:3), range = c(1,15)) +
guides(fill = guide_legend(),
size=guide_legend(override.aes = list(size = legend_size)))
p3
与点图搭配
p4 <- ggplot(mapping=aes(x=wt, y=mpg, fill=drat)) +
geom_point(data=subset(mtcars, cyl>6),
shape=21,
size=3,
stroke=0) +
geom_star(data=subset(mtcars, cyl<=6),
size=3.2) +
scale_fill_gradient(low="blue", high="red")+
theme_bw() +
theme(panel.grid=element_blank())
p4
总结
虽然实现了⭐️图层,但还不是最佳的方法,因为当图片拉伸后,⭐️会变形,而且也不能通过geom_point
的shape
来进行简单映射。翻看源码后才知道geom_point
还是调用了grid
,所以貌似要实现拉伸不变形以及可以和geom_point
一起映射的话得再了解更深点。
期待更多技术分享,请长按下方二维码关注本公众号